package com.yao;

import com.yao.util.CollectionUtils;
import com.yao.web.WebApplicationInitializer;
import lombok.extern.slf4j.Slf4j;

import javax.servlet.*;
import javax.servlet.annotation.HandlesTypes;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

@HandlesTypes(value={WebApplicationInitializer.class})
@Slf4j
public class SpringServletContainerInitializer implements ServletContainerInitializer {
    /**
     * 应用启动的时候，会运行onStartup方法；
     *
     * Set<Class<?>> classSet：感兴趣的类型的所有子类型；
     * ServletContext arg1:代表当前Web应用的ServletContext；一个Web应用一个ServletContext；
     *
     * 1）、使用ServletContext注册Web组件（Servlet、Filter、Listener）
     * 2）、使用编码的方式，在项目启动的时候给ServletContext里面添加组件；
     *      必须在项目启动的时候来添加；
     *      1）、ServletContainerInitializer得到的ServletContext；
     *      2）、ServletContextListener得到的ServletContext；
     */
    @Override
    public void onStartup(Set<Class<?>> classSet, ServletContext sc) throws ServletException {
        // TODO Auto-generated method stub
        log.info("感兴趣的类型：{}",classSet);
        sc.setInitParameter("view-prefix","/WEB-INF/templates/");
        sc.setInitParameter("view-suffix",".html");

        List<WebApplicationInitializer> initializers=new ArrayList<>();
        for (Class<?> claz : classSet) {
            try {
                WebApplicationInitializer initializer = (WebApplicationInitializer) claz.getDeclaredConstructor().newInstance();
                initializers.add(initializer);
            } catch (InstantiationException e) {
                throw new RuntimeException(e);
            } catch (IllegalAccessException e) {
                throw new RuntimeException(e);
            } catch (InvocationTargetException e) {
                throw new RuntimeException(e);
            } catch (NoSuchMethodException e) {
                throw new RuntimeException(e);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }

        }

        if(!CollectionUtils.isEmpty(initializers)){
            initializers.stream().forEach(item-> {
                try {
                    item.onStartup(sc);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            });
        }
//        //注册组件  ServletRegistration
//        ServletRegistration.Dynamic servlet = sc.addServlet("userServlet", new UserServlet());
//        //配置servlet的映射信息
//        servlet.addMapping("/user");
//        //注册Listener
//        sc.addListener(UserListener.class);
//        //注册Filter  FilterRegistration
//        FilterRegistration.Dynamic filter = sc.addFilter("userFilter", UserFilter.class);
//        //配置Filter的映射信息
//        filter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");
    }
}